using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using MakeIT.Framework.Util;
using MakeIT.SGI.ERP.Entidades;
using MakeIT.SGI.ERP.Negocios;

namespace MakeIT.SGI.ERP.Apresentacao
{
    public partial class CadastroUsuario : System.Web.UI.Page
    {

        UsuarioVO usuarioLVO = null;
        protected SgiDAOT SgiDAOT = null;

        protected void Page_Load(object sender, EventArgs e)
        {
            this.SgiDAOT = new SgiDAOT();
            usuarioLVO = (UsuarioVO)this.Session["userActive"];

            if (!IsPostBack)
            {
                Util.HabilitarCampos(false, this.panelCad);


                this.panelUsuarioxobjeto.Enabled = false;
                this.panelUsuarioxperfil.Enabled = false;


                carregaFilial();

            }

        }

        protected void Page_Unload(object sender, EventArgs e)
        {
            try
            {
                if (this.SgiDAOT != null)
                    this.SgiDAOT.closeDAO();
            }
            catch (Exception ex) { }
        }

        protected void atualizarDdlidPessoa(object sender, ImageClickEventArgs e)
        {
            CarregaDDL.carregaPessoa(this.SgiDAOT, ddlCadIdPessoa, txtCadPesquisarPessoa.Text, Convert.ToInt32(ddlCadFilial.SelectedValue));
        }

        protected void carregaFilial()
        {
            CarregaDDL.carregaFilial(this.SgiDAOT, ddlCadFilial);

            CarregaDDL.carregaFilial(this.SgiDAOT, ddlIdFilial);

        }




        /// <summary>
        /// Manipula o evento do botão btnSalvar
        /// </summary>
        /// <param name="sender">Objeto disparador do evento</param>
        /// <param name="e">Argumento do evento</param>
        protected void btnSalvar_Click(object sender, EventArgs e)
        {
            if (txtCadPass.Text.Equals(txtCadPassRepete.Text))
            {


                //Declara objetos
                UsuarioVO usuarioVOR = null;
                bool novoRegistro = false;

                try
                {
                    //Verifica se o ID é nulo, se sim = cadastro novo
                    if (string.IsNullOrEmpty(this.txtCadIdUsuario.Text))
                    {
                        usuarioVOR = UsuarioVO.CreateVO();
                        usuarioVOR.cadastro = DateTime.Now;
                        usuarioVOR.cadastradoPor = usuarioLVO.user;

                        novoRegistro = true;

                    }
                    //Recupera dados para serem alterados
                    else
                    {
                        //Recupera dados
                        usuarioVOR = SgiDAOT.getUsuario(Int32.Parse(this.txtCadIdUsuario.Text));
                    }

                    usuarioVOR.user = this.txtCadUser.Text;
                    if (!string.IsNullOrEmpty(this.txtCadPass.Text))
                        usuarioVOR.pass = this.txtCadPass.Text;
                    usuarioVOR.ativo = this.ddlCadAtivo.SelectedValue.Equals("S");
                    usuarioVOR.idPessoa = Int32.Parse(this.ddlCadIdPessoa.SelectedValue);
                    usuarioVOR.edicao = DateTime.Now;
                    usuarioVOR.editadoPor = usuarioLVO.user;

                    //Chama metodo para salvar ou criar novo registro
                    if (verificaUsuarioExistente())
                    {
                        if (novoRegistro)
                            usuarioVOR.idUsuario = (int)SgiDAOT.newUsuario(usuarioVOR);
                        else
                            SgiDAOT.setUsuario(usuarioVOR);
                    }
                    else
                    {
                        return;
                    }

                    // Exibe msg de sucesso ao salvar registro
                    Util.ExibeAlert(this, "Registro salvo com sucesso!");

                    //Popula grid atualizado
                    this.btnPesquisa_Click(null, null);

                    //Atualiza formulario, apos salvar os dados
                    this.txtCadIdUsuario.Text = usuarioVOR.idUsuario.ToString();
                    this.ltCadastradoPor.Text = usuarioVOR.cadastradoPor;
                    this.ltEditadoPor.Text = usuarioVOR.editadoPor;
                    this.ltDataCadastro.Text = usuarioVOR.cadastro.ToString("dd/MM/yyyy");
                    this.ltDataEdicao.Text = usuarioVOR.edicao.ToString("dd/MM/yyyy");

                    //habilita Usuarioxobjeto
                    if (!this.panelUsuarioxobjeto.Enabled)
                    {
                        this.ltCadUsuarioxobjetoUsuario.Text = usuarioVOR.ToString();
                        Util.HabilitarCampos(false, this.panelUsuarioxobjeto);
                        this.panelUsuarioxobjeto.Enabled = true;
                        this.btnCadUsuarioxobjetoSalvar.Enabled = false;
                        this.btnCadUsuarioxobjetoEditar.Enabled = true;
                    }
                    carregaUsuarioXObjetos();


                    //habilita Usuarioxobjeto
                    if (!this.panelUsuarioxperfil.Enabled)
                    {
                        this.ltCadUsuarioxoperfilUsuario.Text = usuarioVOR.ToString();
                        Util.HabilitarCampos(false, this.panelUsuarioxperfil);
                        this.panelUsuarioxperfil.Enabled = true;
                        this.btnCadUsuarioxperfilSalvar.Enabled = false;
                        this.btnCadUsuarioxperfilEditar.Enabled = true;
                    }
                    carregaUsuarioXPerfils();
                }
                catch (Exception ex)
                {

                    throw ex;
                }
            }
            else
            {
                return;
            }
        }

        /// <summary>
        /// Manipula o evento do botão btnPesquisa
        /// </summary>
        /// <param name="sender">Objeto disparador do evento</param>
        /// <param name="e">Argumento do evento</param>
        protected void btnPesquisa_Click(object sender, EventArgs e)
        {

            //Declara objetos
            int? idUsuario = null;
            string user = null;
            bool? ativo = null;
            int? idFilial = null;

            try
            {

                if (!string.IsNullOrEmpty(this.txtIdUsuario.Text))
                {
                    idUsuario = Int32.Parse(this.txtIdUsuario.Text);
                }

                if (!string.IsNullOrEmpty(this.txtUser.Text))
                {
                    user = this.txtUser.Text;
                }

                if (!this.ddlAtivo.SelectedValue.Equals(" "))
                {
                    ativo = this.ddlAtivo.SelectedValue.Equals("S");
                }

                if (!this.ddlIdFilial.SelectedValue.Equals("-1"))
                {
                    idFilial = Int32.Parse(this.ddlIdFilial.SelectedValue);
                }

                //Recupera a lista de registros segundo a pesquisa
                this.grvResultado.DataSource = SgiDAOT.getUsuarios(idUsuario, null, user, ativo,  idFilial, null);

                //Vincula os dados
                this.grvResultado.DataBind();
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        /// <summary>
        /// Manipula o evento do botão btnCancelar
        /// </summary>
        /// <param name="sender">Objeto disparador do evento</param>
        /// <param name="e">Argumento do evento</param>
        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            //Volta para a tab page de pesquisa
            //this.tabUsuario.ActiveTabIndex = 0;

            this.btnPesquisarPessoa.Enabled = false;

            // Desabilita os campos para edição
            Util.HabilitarCampos(false, this.panelCad);

            // Destrava botão de edição
            this.btnEditar.Enabled = (!string.IsNullOrEmpty(this.txtCadIdUsuario.Text));

            // Destrava botão de exclusao
            this.btnExcluir.Enabled = (!string.IsNullOrEmpty(this.txtCadIdUsuario.Text));

            // Detrava botão de novo
            this.btnNovo.Enabled = true;

            // Desabilita o botão salvar
            this.btnSalvar.Enabled = false;

        }

        protected void imgbVisualizar_Click(object sender, ImageClickEventArgs e)
        {
            // Declara objetos
            UsuarioVO usuarioVO = null;
            int idUsuario = 0;

            try
            {
                //Recupera os argumentos com o ID do objeto
                string[] argumentos = ((ImageButton)sender).CommandArgument.Split(';');
                idUsuario = Int32.Parse(argumentos[0]);

                //Recupera o objeto
                usuarioVO = SgiDAOT.getUsuario(idUsuario);

                this.txtCadIdUsuario.Text = usuarioVO.idUsuario.ToString();
                this.txtCadUser.Text = usuarioVO.user;
                this.txtCadPass.Text = usuarioVO.pass;
                this.ddlCadAtivo.SelectedValue = (usuarioVO.ativo == null ? " " : (usuarioVO.ativo.Value ? "S" : "N"));
                
                PessoaVO pVO = SgiDAOT.getPessoa(usuarioVO.idPessoa);
                
                this.ddlCadFilial.SelectedValue = pVO.idFilial.ToString();
                this.txtCadPesquisarPessoa.Text = pVO.pessoa;
                atualizarDdlidPessoa(null, null);
                this.ddlCadIdPessoa.SelectedValue = usuarioVO.idPessoa.ToString();


                this.ltCadastradoPor.Text = usuarioVO.cadastradoPor;
                this.ltEditadoPor.Text = usuarioVO.editadoPor;
                this.ltDataCadastro.Text = usuarioVO.cadastro.ToString("dd/MM/yyyy");
                this.ltDataEdicao.Text = usuarioVO.edicao.ToString("dd/MM/yyyy");

                //recupera Usuarioxobjeto
                Util.HabilitarCampos(false, this.panelUsuarioxobjeto);
                this.panelUsuarioxobjeto.Enabled = true;
                this.ltCadUsuarioxobjetoUsuario.Text = usuarioVO.ToString();
                this.btnCadUsuarioxobjetoSalvar.Enabled = false;
                this.btnCadUsuarioxobjetoEditar.Enabled = true;

                carregaUsuarioXObjetos();
                this.gvUsuarioXObjetos.Enabled = false;


                //recupera Usuarioxperfil
                Util.HabilitarCampos(false, this.panelUsuarioxperfil);
                this.panelUsuarioxperfil.Enabled = true;
                this.ltCadUsuarioxoperfilUsuario.Text = usuarioVO.ToString();
                this.btnCadUsuarioxperfilSalvar.Enabled = false;
                this.btnCadUsuarioxperfilEditar.Enabled = true;

                carregaUsuarioXPerfils();
                this.gvUsuarioXPerfils.Enabled = false;



                this.btnPesquisarPessoa.Enabled = false;

                //Habilita tab page do cadastro
                this.tabUsuario.ActiveTabIndex = 1;

                //Desabilita campos para edição
                Util.HabilitarCampos(false, this.panelCad);

                //Desabilita botão salvar
                this.btnSalvar.Enabled = false;

                //Habilita botão editar
                this.btnEditar.Enabled = true;


                //Habilita botão excluir
                this.btnExcluir.Enabled = true;

                //Habilita botão novo
                this.btnNovo.Enabled = true;


            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        // <summary>
        // Manipula o evento editar do web form
        // </summary>
        // <param name="sender">Objeto disparador de evento</param>
        // <param name="e">Argumento do evento</param>
        protected void btnEditar_Click(object sender, EventArgs e)
        {
            // Habilita os campos para edição
            Util.HabilitarCampos(true, this.panelCad);

            // Trava apenas os text box da PK
            this.txtCadIdUsuario.Enabled = false;

            this.btnPesquisarPessoa.Enabled = true;

            // Trava botão de edição
            this.btnEditar.Enabled = false;

            // Trava botão de exclusao
            this.btnExcluir.Enabled = false;

            // Trava botão de novo
            this.btnNovo.Enabled = false;

            // Habilita o botão salvar
            this.btnSalvar.Enabled = true;

        }

        protected void btnNovo_Click(object sender, EventArgs e)
        {
            ddlCadFilial.SelectedIndex = 0;
            atualizarDdlidPessoa(null, null);

            //Limpa formulario, para a entrada de novo registro
            Util.LimparCampos(this.panelCad);
            // Habilita os campos para edição
            Util.HabilitarCampos(true, this.panelCad);

            this.ltCadastradoPor.Text = "";
            this.ltEditadoPor.Text = "";
            this.ltDataCadastro.Text = "";
            this.ltDataEdicao.Text = "";

            // Limpa Usuarioxobjeto
            Util.LimparCampos(this.panelUsuarioxobjeto);
            Util.HabilitarCampos(false, this.panelUsuarioxobjeto);
            this.ltCadUsuarioxobjetoUsuario.Text = "";
            this.panelUsuarioxobjeto.Enabled = false;
            this.btnCadUsuarioxobjetoSalvar.Enabled = false;
            this.btnCadUsuarioxobjetoEditar.Enabled = false;


            // Limpa Perfil
            Util.LimparCampos(this.panelUsuarioxperfil);
            Util.HabilitarCampos(false, this.panelUsuarioxperfil);
            this.ltCadUsuarioxoperfilUsuario.Text = "";
            this.panelUsuarioxperfil.Enabled = false;
            this.btnCadUsuarioxperfilSalvar.Enabled = false;
            this.btnCadUsuarioxperfilEditar.Enabled = false;


            this.btnPesquisarPessoa.Enabled = true;

            // Trava apenas os text box da PK
            this.txtCadIdUsuario.Enabled = false;

            // Trava botão de edição
            this.btnEditar.Enabled = false;

            // Trava botão de exclusao
            this.btnExcluir.Enabled = false;

            // Trava botão de novo
            this.btnNovo.Enabled = false;

            // Habilita o botão salvar
            this.btnSalvar.Enabled = true;

        }

        protected void btnExcluir_Click(object sender, EventArgs e)
        {
            //Declara objetos
            UsuarioVO usuarioVO = null;

            try
            {
                //Cria objeto
                usuarioVO = UsuarioVO.CreateVO();
                usuarioVO.idUsuario = Int32.Parse(this.txtCadIdUsuario.Text);

                //verifica se tem perfilxusuario dependentes deste registro
                if (SgiDAOT.getCountPerfilxusuarioxIdUsuario(usuarioVO.idUsuario) > 0)
                {
                    Util.ExibeAlert(this, "Há Perfil X Usuário(s) associado(s) a este registro. Exclusão não permitida");
                    return;
                }

                //verifica se tem agendaxusuario dependentes deste registro
                if (SgiDAOT.getCountAgendaxusuarioxIdUsuário(usuarioVO.idUsuario) > 0)
                {
                    Util.ExibeAlert(this, "Há Agendamento de usuários(s) associado(s) a este registro. Exclusão não permitida");
                    return;
                }

                // Remove Usuarioxobjeto
                List<UsuarioxobjetoVO> usuarioxobjetoVOs = SgiDAOT.getUsuarioxobjetos(null, usuarioVO.idUsuario, null, null, null);
                foreach (UsuarioxobjetoVO usuarioxobjetoVO in usuarioxobjetoVOs)
                    SgiDAOT.delUsuarioxobjeto(usuarioxobjetoVO);

                //Chama metodo para excluir registro
                SgiDAOT.delUsuario(usuarioVO);
                deleteUsuarioXObjetos();

                // Exibe msg de sucesso ao salvar registro
                Util.ExibeAlert(this, "Registro excluido com sucesso!");

                //Popula grid atualizado
                this.btnPesquisa_Click(null, null);

                //Limpa formulario, apos salvar os dados
                Util.LimparCampos(this.panelCad);

                //Limpa Usuarioxobjeto
                Util.LimparCampos(this.panelUsuarioxobjeto);
                Util.HabilitarCampos(false, this.panelUsuarioxobjeto);
                this.panelUsuarioxobjeto.Enabled = false;
                this.ltCadUsuarioxobjetoUsuario.Text = "";
                this.gvUsuarioXObjetos.DataSource = null;
                this.gvUsuarioXObjetos.DataBind();
                this.btnCadUsuarioxobjetoSalvar.Enabled = false;
                this.btnCadUsuarioxobjetoEditar.Enabled = false;

                //Limpa Usuarioxperfil
                Util.LimparCampos(this.panelUsuarioxperfil);
                Util.HabilitarCampos(false, this.panelUsuarioxperfil);
                this.panelUsuarioxperfil.Enabled = false;
                this.ltCadUsuarioxoperfilUsuario.Text = "";
                this.gvUsuarioXPerfils.DataSource = null;
                this.gvUsuarioXPerfils.DataBind();
                this.btnCadUsuarioxperfilSalvar.Enabled = false;
                this.btnCadUsuarioxperfilEditar.Enabled = false;

                this.ltCadastradoPor.Text = "";
                this.ltEditadoPor.Text = "";
                this.ltDataCadastro.Text = "";
                this.ltDataEdicao.Text = "";


                this.btnPesquisarPessoa.Enabled = false;

                // Trava botão de edição
                this.btnEditar.Enabled = false;

                // Trava botão de exclusao
                this.btnExcluir.Enabled = false;

                // Desabilita o botão salvar
                this.btnSalvar.Enabled = false;

                // Habilita o botao novo
                this.btnNovo.Enabled = true;

            }
            catch (Exception ex)
            {

                throw ex;
            }

        }


        protected void btnPesquisarPessoa_Click(object sender, EventArgs e)
        {
            if (!String.IsNullOrEmpty(txtCadPesquisarPessoa.Text) && !ddlCadFilial.SelectedValue.Equals("-1"))
                atualizarDdlidPessoa(null, null);
            else
                Util.ExibeAlert(this, "Informe a pessoa e a filial para a pesquisa!");
        }

        protected bool verificaUsuarioExistente()
        {
            List<UsuarioVO> uVOLista = SgiDAOT.getUsuarios(null, null, txtCadUser.Text, null, null, usuarioLVO.idPessoaVO.idFilialVO.idEmpresaVO.idEmpresa);

            if (uVOLista == null || (uVOLista.Count == 0) || (uVOLista.Count == 1 && txtCadIdUsuario.Text.Equals(uVOLista[0].idUsuario.ToString())))
            {
                return true;
            }
            else
            {
                Util.ExibeAlert(this, "Não foi possivel Salvar! Nome de Usuário já cadastrado para esta empresa!");
                return false;
            }
        }

        protected void ddlCadFilial_SelectedIndexChanged(object sender, EventArgs e)
        {
            atualizarDdlidPessoa(null, null);
        }

        #region UsuarioXUsuarioxobjeto



        protected void carregaUsuarioXObjetos()
        {
            gvUsuarioXObjetos.DataSource = SgiDAOT.getObjetos();
            gvUsuarioXObjetos.DataBind();
        }

        protected void gvUsuarioXObjetos_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                if (!String.IsNullOrEmpty(txtCadIdUsuario.Text))
                {
                    int idObjeto = int.Parse(((HiddenField)e.Row.FindControl("hfIdObjeto")).Value);
                    int idUsuario = int.Parse(txtCadIdUsuario.Text);

                    UsuarioxobjetoVO uoVO = SgiDAOT.getUsuarioxobjeto(null, idUsuario, idObjeto);

                    if (uoVO != null)
                    {
                        CheckBox cb = (CheckBox)e.Row.FindControl("cbVisivel");
                        if ((bool)uoVO.visivel)
                            cb.Checked = true;

                        cb = (CheckBox)e.Row.FindControl("cbHabilitado");
                        if ((bool)uoVO.habilitado)
                            cb.Checked = true;
                    }
                }
            }
        }

        protected void deleteUsuarioXObjetos()
        {
            try
            {
                if (!String.IsNullOrEmpty(txtCadIdUsuario.Text))
                {
                    int idUsuario = int.Parse(txtCadIdUsuario.Text);
                    foreach (UsuarioxobjetoVO uoVO in SgiDAOT.getUsuarioxobjetos(null, idUsuario, null))
                    {
                        SgiDAOT.delUsuarioxobjeto(uoVO);
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


        protected void btnCadUsuarioxobjetoSalvar_Click(object sender, EventArgs e)
        {
            try
            {
                this.SgiDAOT.transactionBegin();

                foreach (GridViewRow row in gvUsuarioXObjetos.Rows)
                {
                    if (!String.IsNullOrEmpty(txtCadIdUsuario.Text))
                    {
                        int idObjeto = int.Parse(((HiddenField)row.FindControl("hfIdObjeto")).Value);
                        int idUsuario = int.Parse(txtCadIdUsuario.Text);

                        CheckBox cb1 = (CheckBox)row.FindControl("cbVisivel");
                        CheckBox cb2 = (CheckBox)row.FindControl("cbHabilitado");

                        UsuarioxobjetoVO uoVO = SgiDAOT.getUsuarioxobjeto(null, idUsuario, idObjeto);


                        if (cb1.Checked || cb2.Checked)
                        {
                            UsuarioxobjetoVO uoVOAcao = UsuarioxobjetoVO.CreateVO();


                            uoVOAcao.idUsuario = idUsuario;
                            uoVOAcao.idObjeto = idObjeto;
                            uoVOAcao.visivel = cb1.Checked;
                            uoVOAcao.habilitado = cb2.Checked;


                            uoVOAcao.editadoPor = this.usuarioLVO.user;
                            uoVOAcao.edicao = DateTime.Now;

                            if (uoVO != null)
                            {
                                uoVOAcao.idUsuarioXObjeto = uoVO.idUsuarioXObjeto;
                                SgiDAOT.setUsuarioxobjeto(uoVOAcao);
                            }
                            else
                            {
                                uoVOAcao.cadastradoPor = this.usuarioLVO.user;
                                uoVOAcao.cadastro = DateTime.Now;

                                SgiDAOT.newUsuarioxobjeto(uoVOAcao);
                            }
                        }
                        else
                        {
                            if (uoVO != null)
                            {
                                SgiDAOT.delUsuarioxobjeto(uoVO);
                            }
                        }
                    }
                }

                this.SgiDAOT.transactionCommit();

                // Exibe msg de sucesso ao salvar registro
                Util.ExibeAlert(this, "Registro salvo com sucesso!");

                

            }
            catch (Exception ex1)
            {
                try
                {
                    if (this.SgiDAOT != null)
                        this.SgiDAOT.transactionRollBack();
                    Util.ExibeAlert(this, "Registro NÃO salvo! Erro: " + ex1.Message);
                }
                catch (Exception ex2)
                {
                    Util.ExibeAlert(this, "Problema inesperado ao salvar! Erro: " + ex2.Message);
                }
            }


        }

        protected void btnCadUsuarioxobjetoCancelar_Click(object sender, EventArgs e)
        {
            //Volta para a tab page de pesquisa
            //this.tabUsuario.ActiveTabIndex = 0;

            // Desabilita os campos para edição
            Util.HabilitarCampos(false, this.panelUsuarioxobjeto);

            this.btnCadUsuarioxobjetoEditar.Enabled = true;

            // Desabilita o botão salvar
            this.btnCadUsuarioxobjetoSalvar.Enabled = false;

            this.gvUsuarioXObjetos.Enabled = false;

        }

        protected void btnCadUsuarioxobjetoEditar_Click(object sender, EventArgs e)
        {
            // Habilita os campos para edição
            Util.HabilitarCampos(true, this.panelUsuarioxobjeto);

            this.btnCadUsuarioxobjetoEditar.Enabled = false;

            this.btnCadUsuarioxobjetoSalvar.Enabled = true;

            this.gvUsuarioXObjetos.Enabled = true;
        }




        protected void cbVisivelTodos_CheckedChanged(object sender, EventArgs e)
        {
            foreach (GridViewRow row in gvUsuarioXObjetos.Rows)
            {
                CheckBox cb = (CheckBox)row.FindControl("cbVisivel");
                cb.Checked = ((CheckBox)sender).Checked;
            }
        }

        protected void cbHabilitadoTodos_CheckedChanged(object sender, EventArgs e)
        {
            foreach (GridViewRow row in gvUsuarioXObjetos.Rows)
            {
                CheckBox cb = (CheckBox)row.FindControl("cbHabilitado");
                cb.Checked = ((CheckBox)sender).Checked;
            }
        }

        protected void btnResetVisivel_Click(object sender, ImageClickEventArgs e)
        {
            resetCheckBoxObjeto("cbVisivelTodos", "cbVisivel", 1);
        }

        protected void btnResetHabilitado_Click(object sender, ImageClickEventArgs e)
        {
            resetCheckBoxObjeto("cbHabilitadoTodos", "cbHabilitado", 2);
        }

        protected void resetCheckBoxObjeto(string IdCheckBoxPai, string IdCheckBoxFilho, int campo)
        {
            CheckBox cb = null;
            cb = (CheckBox)gvUsuarioXObjetos.HeaderRow.FindControl(IdCheckBoxPai);
            cb.Checked = false;

            foreach (GridViewRow row in gvUsuarioXObjetos.Rows)
            {
                if (!String.IsNullOrEmpty(txtCadIdUsuario.Text))
                {

                    int idObjeto = int.Parse(((HiddenField)row.FindControl("hfIdObjeto")).Value);
                    int idUsuario = int.Parse(txtCadIdUsuario.Text);

                    UsuarioxobjetoVO uoVO = SgiDAOT.getUsuarioxobjeto(null, idUsuario, idObjeto);

                    cb = (CheckBox)row.FindControl(IdCheckBoxFilho);

                    if (uoVO != null)
                    {
                        if (noCheckModelObjeto(campo, uoVO))
                            cb.Checked = true;
                        else
                            cb.Checked = false;
                    }
                    else
                    {
                        cb.Checked = false;
                    }
                }
            }
        }

        protected bool noCheckModelObjeto(int campo, UsuarioxobjetoVO usuarioXObjetoVO)
        {
            switch (campo)
            {
                case 1:
                    return (bool)usuarioXObjetoVO.visivel;
                case 2:
                    return (bool)usuarioXObjetoVO.habilitado;
                default:
                    return (bool)usuarioXObjetoVO.habilitado;
            }
        }


        #endregion



        #region UsuarioXUsuarioxPerfil



        protected void carregaUsuarioXPerfils()
        {
            List<PerfilVO> perfilVOLista = new List<PerfilVO>();

            if (!String.IsNullOrEmpty(txtCadIdUsuario.Text))
            {
                foreach (PessoaVO pVOItem in SgiDAOT.getPessoas(SgiDAOT.getUsuario(Convert.ToInt32(txtCadIdUsuario.Text)).idPessoa))
                {
                    foreach (FilialVO fVOItem in SgiDAOT.getFilials(pVOItem.idFilial))
                    {
                        foreach (PerfilVO peVOItem in SgiDAOT.getPerfils(null, null, fVOItem.idFilial))
                        {
                            perfilVOLista.Add(peVOItem);
                        }
                    }
                }
            }

            gvUsuarioXPerfils.DataSource = perfilVOLista;
            gvUsuarioXPerfils.DataBind();
        }

        protected void gvUsuarioXPerfils_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                if (!String.IsNullOrEmpty(txtCadIdUsuario.Text))
                {
                    int idPerfil = int.Parse(((HiddenField)e.Row.FindControl("hfIdPerfil")).Value);
                    int idUsuario = int.Parse(txtCadIdUsuario.Text);

                    PerfilxusuarioVO puVO = SgiDAOT.getPerfilxusuario(null, idPerfil, idUsuario);

                    if (puVO != null)
                    {
                        CheckBox cb = (CheckBox)e.Row.FindControl("cbPertence");
                        cb.Checked = true;
                    }
                }
            }
        }

        protected void deleteUsuarioXPerfils()
        {
            //try
            //{
            //    if (!String.IsNullOrEmpty(txtCadIdUsuario.Text))
            //    {
            //        int idUsuario = int.Parse(txtCadIdUsuario.Text);
            //        foreach (UsuarioxobjetoVO uoVO in SgiDAOT.getUsuarioxobjetos(null, idUsuario, null))
            //        {
            //            SgiDAOT.delUsuarioxobjeto(uoVO);
            //        }
            //    }
            //}
            //catch (Exception ex)
            //{
            //    throw ex;
            //}
        }


        protected void btnCadUsuarioxperfilSalvar_Click(object sender, EventArgs e)
        {
            try
            {
                this.SgiDAOT.transactionBegin();

                foreach (GridViewRow row in gvUsuarioXPerfils.Rows)
                {
                    if (!String.IsNullOrEmpty(txtCadIdUsuario.Text))
                    {
                        int idPerfil = int.Parse(((HiddenField)row.FindControl("hfIdPerfil")).Value);
                        int idUsuario = int.Parse(txtCadIdUsuario.Text);

                        CheckBox cb1 = (CheckBox)row.FindControl("cbPertence");

                        PerfilxusuarioVO puVO = SgiDAOT.getPerfilxusuario(null, idPerfil, idUsuario);


                        if (cb1.Checked)
                        {
                            PerfilxusuarioVO puVOAcao = PerfilxusuarioVO.CreateVO();


                            puVOAcao.idUsuario = idUsuario;
                            puVOAcao.idPerfil = idPerfil;


                            puVOAcao.editadoPor = this.usuarioLVO.user;
                            puVOAcao.edicao = DateTime.Now;

                            if (puVO != null)
                            {
                                puVOAcao.idPerfilXUsuario = puVO.idPerfilXUsuario;
                                SgiDAOT.setPerfilxusuario(puVOAcao);
                            }
                            else
                            {
                                puVOAcao.cadastradoPor = this.usuarioLVO.user;
                                puVOAcao.cadastro = DateTime.Now;

                                SgiDAOT.newPerfilxusuario(puVOAcao);
                            }
                        }
                        else
                        {
                            if (puVO != null)
                            {
                                SgiDAOT.delPerfilxusuario(puVO);
                            }
                        }
                    }
                }

                this.SgiDAOT.transactionCommit();

                // Exibe msg de sucesso ao salvar registro
                Util.ExibeAlert(this, "Registro salvo com sucesso!");


            }
            catch (Exception ex1)
            {
                try
                {
                    if (this.SgiDAOT != null)
                        this.SgiDAOT.transactionRollBack();
                    Util.ExibeAlert(this, "Registro NÃO salvo! Erro: " + ex1.Message);
                }
                catch (Exception ex2)
                {
                    Util.ExibeAlert(this, "Problema inesperado ao salvar! Erro: " + ex2.Message);
                }
            }


        }

        protected void btnCadUsuarioxperfilCancelar_Click(object sender, EventArgs e)
        {

            // Desabilita os campos para edição
            Util.HabilitarCampos(false, this.panelUsuarioxperfil);

            this.btnCadUsuarioxperfilEditar.Enabled = true;

            // Desabilita o botão salvar
            this.btnCadUsuarioxperfilSalvar.Enabled = false;

            this.gvUsuarioXPerfils.Enabled = false;

        }

        protected void btnCadUsuarioxperfilEditar_Click(object sender, EventArgs e)
        {
            // Habilita os campos para edição
            Util.HabilitarCampos(true, this.panelUsuarioxperfil);

            this.btnCadUsuarioxperfilEditar.Enabled = false;

            this.btnCadUsuarioxperfilSalvar.Enabled = true;

            this.gvUsuarioXPerfils.Enabled = true;
        }




        protected void cbPertenceTodos_CheckedChanged(object sender, EventArgs e)
        {
            foreach (GridViewRow row in gvUsuarioXPerfils.Rows)
            {
                CheckBox cb = (CheckBox)row.FindControl("cbPertence");
                cb.Checked = ((CheckBox)sender).Checked;
            }
        }

        protected void btnResetPertence_Click(object sender, ImageClickEventArgs e)
        {
            resetCheckBoxPerfil("cbPertenceTodos", "cbPertence");
        }

        protected void resetCheckBoxPerfil(string IdCheckBoxPai, string IdCheckBoxFilho)
        {
            CheckBox cb = null;
            cb = (CheckBox)gvUsuarioXPerfils.HeaderRow.FindControl(IdCheckBoxPai);
            cb.Checked = false;

            foreach (GridViewRow row in gvUsuarioXPerfils.Rows)
            {
                if (!String.IsNullOrEmpty(txtCadIdUsuario.Text))
                {

                    int idPerfil = int.Parse(((HiddenField)row.FindControl("hfIdPerfil")).Value);
                    int idUsuario = int.Parse(txtCadIdUsuario.Text);

                    PerfilxusuarioVO puVO = SgiDAOT.getPerfilxusuario(null, idPerfil, idUsuario);

                    cb = (CheckBox)row.FindControl(IdCheckBoxFilho);

                    if (puVO != null)
                    {
                        cb.Checked = true;
                    }
                    else
                    {
                        cb.Checked = false;
                    }
                }
            }
        }



        #endregion

    }
}
